• 在创建shell脚本文件时必须在文件的第一行指定要使用的shell,其格式为:#!/bin/bash,

    在通常的shell脚本中,井号(#)用作注释行,shell脚本不会处理shell脚本中的注释行,但是第一行是个例外,后面的!号会告诉shell用哪个shell来运行脚本。

  • 为了运行shell脚本,有两种方法:
    • 将shell脚本文件所处的目录添加到PATH环境变量中
    • 在提示符中用绝对路径或相对文件路径来引用shell脚本文件
  • 需要的是当创建一个shell脚本文件后,默认的shell脚本文件没有可执行的权限,可以通过chmod命令来为shell添加可执行的权限,例如:chmod u+x test1
  • 在shell脚本文件中,如果想把文本字符串和命令输出显示在同一行中,可以使用echo语句的-n参数,例如:

    1
    2
    echo -n "The time and date are: "
    date

    这样文本字符串和命令输出就会显示在同一行,需要注意的是此时字符串的两侧需要使用引号

  • 在Shell脚本中,可以在环境变量前面加上$符号来使用环境变量:$UID $HOME
  • shell脚本中的用户变量是区分大小写的,所以Var1 和 var1是不同的
  • 使用等号将值赋给用户变量,在变量、等号和值之间不能出现空格,例如:var1=10,shell脚本会自动决定变量值的数据类型,在脚本的整个生命周期中shell脚本中定义的变量会一直保持着它们的值,但在shell脚本结束时会被删除掉,与系统变量类似,用户变量可通过$符号引用。
  • 有两种方法可以将命令输出赋给变量:

    • 反引号字符(`)
    • $()格式

    命令替换允许你将shell命令的输出赋给变量,例如:testing=$(date),那么变量testing将获得date命令的输出。

    举个例子,在脚本中通过命令替换获得当前日期并用它来生成唯一文件名:

    1
    2
    3
    #!/bin/bash
    today=$(date +%y%m%d)
    ls /usr/bin -al > log.$today
  • 命令替换会创建出一个子shell来运行对应的命令,子shell是由运行该脚本的shell所创建出来的一个独立的子shell,正因为如此子shell所执行命令是无法使用脚本中所创建的变量的。在命令提示符下使用路径./运行命令的话也会创建出子shell,要是运行命令的时候不加入路径,就不会创建子shell,如果你使用的是内建的shell命令,并不会涉及子shell。

  • bash shell用大于号完成将命令的输出发送到一个文件中,例如command > outputfile,如果希望不覆盖文件原有内容,而是将命令的输出追加到已有文件中,可以使用>>来追加数据
  • 输入重定向将文件的内容重定向到命令,使用<来实现: command < inputfile,例如:wc < test表示将test文件中的数据输入到wc中,wc命令可以对数据中的文本进行计数,默认情况下会输出3个值:
    • 文本的行数
    • 文本的词数
    • 文本的字节数
  • 内联输入重定向无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据即可,内联输入重定向符号是<<,除了这个符号,必须指定一个文本标记来划分输入数据的开始和结尾,任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致:

    1
    2
    3
    command << marker
    data
    marker

    举个例子:

  • 1
    2
    3
    4
    5
    wc << EOF
    test string 1
    test string 2
    test string 3
    EOF
  • 在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式围起来,例如:

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    var1=100
    var2=50
    var3=45
    var4=[var1 * (var2 - var3)]
    echo $var4
  • bash shell数学运算符只支持整数运算,若要进行浮点数运算,可以考虑zshell

  • bc命令可以进入bash计算器,要退出bash计算器,必须输入quit。浮点运算是由内建变量scale控制的,必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果。bc -q指令可以不显示bash计算器冗长的欢迎信息。

  • 在脚本中可以这样使用bash计算器,需要使用命令替换运行bc命令,并将输出赋给给一个变量variable=$(echo "options; expression" | bc),第一部分options允许你设置变量,如果需要设置不止一个变量,可以用分号将其分开,expression参数定义了通过bc执行的数学表达式:

    1
    2
    3
    #!/bin/bash
    var1=$("scale=4; 3.44 / 5" | bc)
    echo The answer is $var1
  • 另外一种使用方法是使用内联输入重定向:

    1
    2
    3
    4
    5
    6
    variable=$(bc << EOF
    options
    statement
    expressions
    EOF
    )

    举个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    !#/bin/bash
    var1=10.46
    var2=43.67
    var3=33.2
    var4=71
    var5=$(bc << EOF
    scale = 4
    a1 = (var1 * var2)
    a2 = (var3 * var4)
    a1 + a2
    EOF
    )

    需要注意的是在bash计算器中创建的变量只在bash计算器中有效,不能在shell脚本中使用。

  • shell中每个运行的命令都使用退出状态码告诉shell它已经运行完毕,退出状态码是一个0-255之间的整数值,在命令结束运行时由命令传给shell。
  • 可以使用变量$?来保存上个已执行命令的退出状态码,一个成功结束的命令的退出状态码是0,如果一个命令结束时有错误,退出状态码就是一个正数值
  • 默认情况下shell脚本会以脚本中的最后一个命令的退出状态码退出,可以使用exit命令在脚本结束时指定一个退出状态码